{
  lib,
  stdenv,
  fetchurl,
  makeDesktopItem,
  unzip,
  jre,
  runtimeShell,
}:

stdenv.mkDerivation rec {
  pname = "swingsane";
  version = "0.2";

  src = fetchurl {
    sha256 = "15pgqgyw46yd2i367ax9940pfyvinyw2m8apmwhrn0ix5nywa7ni";
    url = "mirror://sourceforge/swingsane/swingsane-${version}-bin.zip";
  };

  nativeBuildInputs = [ unzip ];

  dontConfigure = true;

  installPhase =
    let

      execWrapper = ''
        #!${runtimeShell}
        exec ${jre}/bin/java -jar $out/share/java/swingsane/swingsane-${version}.jar "$@"
      '';

      desktopItem = makeDesktopItem {
        name = "swingsane";
        exec = "swingsane";
        icon = "swingsane";
        desktopName = "SwingSane";
        genericName = "Scan from local or remote SANE servers";
        comment = meta.description;
        categories = [ "Office" ];
      };

    in
    ''
      install -v -m 755    -d $out/share/java/swingsane/
      install -v -m 644 *.jar $out/share/java/swingsane/

      echo "${execWrapper}" > swingsane
      install -v -D -m 755 swingsane $out/bin/swingsane

      unzip -j swingsane-${version}.jar "com/swingsane/images/*.png"
      install -v -D -m 644 swingsane_512x512.png $out/share/pixmaps/swingsane.png

      cp -v -r ${desktopItem}/share/applications $out/share
    '';

  meta = with lib; {
    description = "Java GUI for SANE scanner servers (saned)";
    longDescription = ''
      SwingSane is a powerful, cross platform, open source Java front-end for
      using both local and remote Scanner Access Now Easy (SANE) servers.
      The most powerful feature is its ability to query back-ends for scanner
      specific options which can be set by the user as a scanner profile.
      It also has support for authentication, mutlicast DNS discovery,
      simultaneous scan jobs, image transformation jobs (deskew, binarize,
      crop, etc), PDF and PNG output.
    '';
    homepage = "http://swingsane.com/";
    sourceProvenance = with sourceTypes; [ binaryBytecode ];
    license = licenses.asl20;
    platforms = platforms.all;
    mainProgram = "swingsane";
  };
}
